/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package graf;

import java.util.ArrayList;

/**
 *
 * @author sufka
 */
public class KrawedzioweAlgorytm implements Pokrycie {

    Graf graf;

    public KrawedzioweAlgorytm(Graf graf) {
        this.graf = graf;
    }

    public ArrayList<Sciezka> tworzPokrycie() {
        ArrayList<Sciezka> zbiorSciezek = new ArrayList<Sciezka>();
        Wierzcholek w;
        for (int i = 0; i < graf.getPoczatkowe().size(); ++i) {
            w = graf.getPoczatkowe().get(i);
            if(!w.isOdwiedzony()){
                w.setOdwiedzony(true);
                zbiorSciezek = pokrywaj(zbiorSciezek, w);
            }
        }

        //teraz dokladam falszywa krawedz do zbioru z wierzcholkami o numerze -1
        Sciezka s2 = new Sciezka();
        Wierzcholek w2 = new Wierzcholek();
        Wierzcholek w2_ = new Wierzcholek();
        w2.setNumer(-1);
        w2_.setNumer(-1);
        s2.dodajNaKoniec(w2);
        s2.dodajNaKoniec(w2_);
        zbiorSciezek.add(s2);
        //i przegladam jeszcze raz wszystkie wierzcholki, czy zostaly przegladaniete

        int ileNieodwiedzonych = zbiorSciezek.size();
        for(int i = 0; i < graf.getWierzcholki().size(); ++i){
            Wierzcholek w1 = graf.getWierzcholki().get(i);
            if(!w1.isOdwiedzony()){
                w1.setOdwiedzony(true);
                zbiorSciezek = pokrywaj(zbiorSciezek, w1);
            }
        }

        //zliczam ile krawedzi zostalo dodanuch po krawedzi falszywej
        ileNieodwiedzonych = zbiorSciezek.size()-ileNieodwiedzonych;

        //i dodaje krawedz z informacja o ilosci krawedzi nie odwiedzalnych
        Sciezka s3 = new Sciezka();
        Wierzcholek w3 = new Wierzcholek();
        Wierzcholek w3_ = new Wierzcholek();
        w3.setNumer(ileNieodwiedzonych);
        w3_.setNumer(ileNieodwiedzonych);
        s3.dodajNaKoniec(w3);
        s3.dodajNaKoniec(w3_);
        zbiorSciezek.add(s3);

        graf.odswiezWierzcholki();
        return zbiorSciezek;
    }

    public ArrayList<Sciezka> pokrywaj(ArrayList<Sciezka> zbior, Wierzcholek w) {
        Wierzcholek wTemp;
        for (int i = 0; i < w.getSasiedzi().size(); ++i) {
            Sciezka s = new Sciezka();
            wTemp = w.getSasiedzi().get(i).getWierzcholek();
            s.dodajNaKoniec(w);
            s.dodajNaKoniec(wTemp);
            zbior.add(s);
            if (!wTemp.isOdwiedzony()) {
                wTemp.setOdwiedzony(true);
                zbior = pokrywaj(zbior, wTemp);
            }
        }
        return zbior;
    }
}
